{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3fb74269-2e6f-4d22-a9b5-810d2bd1b887",
   "metadata": {},
   "source": [
    "1. 假定分组密码F有以下性质:对于随机选择的密钥k，给定可访问的随机预言机F，只需要对随机预言机发出 100 次问询，就可以确定k(以及最小计算时间)。形式化地说明$F_k$不是一个伪随机置换。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75842284-508e-498f-be56-68926326dcae",
   "metadata": {},
   "source": [
    "这个问题涉及到伪随机函数（PRF）和伪随机置换（PRP）的概念。伪随机函数是一种函数，它的输入是一个密钥和一个随机数，输出是一个比特串。伪随机置换是一种置换，它的输入是一个密钥和一个比特串，输出也是一个比特串。分组密码可以被看作是一种伪随机置换。\n",
    "如果一个分组密码F不是伪随机置换，那么就存在一种攻击方法，可以通过对随机预言机发出 100 次问询，来确定密钥k(以及最小计算时间)。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b7607d1a-6f14-450b-8332-189bea3ddf10",
   "metadata": {},
   "source": [
    "2. 在对 2轮代替置换网络的攻击中，思考一个分块长度为 64 比特，有 16个S 盒，且每个S 盒都有4比特输入的网络。对8个S 盒，每个S 盒的输入为8 比特的情况，重新分析攻击的复杂度是什么?对分块长度是 128 比特，以及拥有 8 比特输入的 16 个 S 盒的情况，再分析一次。分块长度会造成任何不同吗?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "378f3bc1-e888-47cf-85fa-eb0c273f1666",
   "metadata": {},
   "source": [
    "这个问题涉及到代替置换网络（SPN）的概念。代替置换网络是一种分组密码，它使用明文块和密钥块作为输入，并通过交错的若干“轮”（或“层”）代换操作和置换操作产生密文块。\n",
    "\n",
    "在对 2轮代替置换网络的攻击中，如果分块长度为64比特，有16个S盒，且每个S盒都有4比特输入的网络，对8个S盒，每个S盒的输入为8比特的情况，重新分析攻击的复杂度是$2^{32}$。如果分块长度为128比特，有16个S盒，且每个S盒都有8比特输入的网络，重新分析攻击的复杂度是$2^{64}$。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14a2979e-b31d-45f3-a9a5-cd15b646e928",
   "metadata": {},
   "source": [
    "在对 2轮代替置换网络的攻击中，如果分块长度为64比特，有16个S盒，且每个S盒都有4比特输入的网络，对8个S盒，每个S盒的输入为8比特的情况，攻击的复杂度是$2^{32}$。\n",
    "\n",
    "计算过程如下：\n",
    "- 每个S盒有$2^4$种可能的输入和$2^4$种可能的输出。\n",
    "- 对于8个S盒，攻击者需要尝试$2^{32}$种可能的输入。\n",
    "- 因此，攻击的复杂度是$2^{32}$。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3325b3ed-f96f-48de-90c1-8342c6d5ce22",
   "metadata": {},
   "source": [
    "3. 对 3 轮代替置换网络的攻击并没有恢复密钥，而只是介绍了如何将分组密码从随机置换区分开，因此它不是“完全破解”。尽管如此，也表明在计数模式加密方案(见 3.6.4节)中使用3 轮代替置换网络可对加密的安全性产生灾难性的影响。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "679b7011-b006-452e-a76c-f610d745f975",
   "metadata": {},
   "source": [
    "在计数模式加密方案中使用3轮代替置换网络可对加密的安全性产生灾难性的影响，因为攻击者可以通过对随机置换的分析来区分计数器模式加密的输出。这种攻击称为“线性区分器攻击”，它可以在多项式时间内成功地执行，而不需要恢复密钥。这意味着攻击者可以更容易地破解加密，因为他们可以更好地预测加密的输出。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a6ed1f4-5f46-4c6e-bdd6-afea722bcf25",
   "metadata": {},
   "source": [
    "4. 考虑一个修改过的代替一置换网络，这里不是以交替方式在r轮中执行密钥混合、代换、置换这些步骤，而是先执行r轮密钥混合，然后执行r轮的代换，最后执行r轮置换。分析这个构造方法的安全性。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "313c6f6d-1de6-4eeb-906b-de7b438717e0",
   "metadata": {},
   "source": [
    "代替一置换网络（SPN）是一种常见的加密算法，它由代换层和置换层组成。代替层将输入分成多个块，并将每个块替换为另一个块。置换层将代替层的输出重新排列。这种结构可以在多个轮次中重复使用，以增加加密的安全性。\n",
    "\n",
    "在您提供的构造方法中，代替层和置换层的顺序被交换了。这种结构可能会导致安全性问题，因为攻击者可能容易地预测加密的输出。然而，这种结构是否安全取决于代替和置换函数的选择以及它们在算法中的使用方式。因此，我无法给出确切的答案，而是建议您查阅更多资料以了解该构造方法的安全性。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2075d11c-f1a0-47f2-8afd-d9ad730371c0",
   "metadata": {},
   "source": [
    "5. 在以下两种情况下, 当输入是 $\\left(L_0, R_0\\right)$ 时, $r$ 轮 Feistel 网络的输出是什么:\n",
    "\n",
    "(1) 每一轮函数输出所有的 0 , 忽略输出。\n",
    "\n",
    "(2) 每一轮函数都是恒等函数。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b1e40cf2-e032-4bf3-b5d6-0055aa93d873",
   "metadata": {},
   "source": [
    "Feistel 网络是一种常见的加密算法，它由代替层和置换层组成。在每一轮中，输入被分成两个块 $L_i$ 和 $R_i$，然后通过代替和置换函数进行处理。最后，输出是 $R_r$ 和 $L_r$。\n",
    "\n",
    "在您提供的情况下，第一种情况下，每一轮函数输出所有的 0 ，忽略输出。因此，输出是 $R_r$ 和 $L_r$。在第二种情况下，每一轮函数都是恒等函数。因此，输出是 $R_0$ 和 $L_0$。左右交换和r有关。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35d14422-283c-4a76-9380-010ba6f51b1a",
   "metadata": {},
   "source": [
    "6. 说明 DES 有这样的特性, 就是对于每 一个密钥 $k$ 和输入 $x$ （这里 $\\bar{z}$ 表示 $z$ 的按位求补）$D E S_k(x)=\\overline{D E S_{\\bar{k}}(\\bar{x})}$\n"
   ]
  },
  {
   "attachments": {
    "0bfefebc-aa79-47d5-a029-eb0b9efe00d9.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "eebbb184-7fd5-44a1-9836-63a3b2711d02",
   "metadata": {},
   "source": [
    "![image.png](attachment:0bfefebc-aa79-47d5-a029-eb0b9efe00d9.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "35ef16e1-5218-4f5d-9551-6cdc021e4c56",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "38637cba-6fb3-47c1-80d5-abf8e7630c9d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "160cf3fd-9320-47ac-9110-d369aa96858b",
   "metadata": {},
   "source": [
    "7. 应用上一个练习说明如何才可能在 DES 中 (以概率为 1 ) 于时间 $2^{55}$ 里找到秘密密钥。 提示：使用选择明文攻击，使用两个仔细选择的明文。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ac6dd4a-5a83-469c-bad6-fed705e72309",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "ccb3677f-fe6c-46bb-b53f-944b15c5a0f1",
   "metadata": {},
   "source": [
    "5.8 在 DES 的实际构造方法中, Feistel 网络的最后-+个轮操作输出的两半部分被交换了。也 就是说, 如果最后 $\\cdots$ 个轮的输出为 $\\left(L_{16}, R_{16}\\right)$, 那么分组密码的输出实际上是 $\\left(R_{16}, L_{16}\\right)$ 。说明对 $D E S_k$ 和 $D E S_k^{-1}$ (给出两半部分的父换）的计算之间的唯一区别就是 子密钥的顺序。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "caa3a910-35a3-4a8c-ae29-5206b59bd11d",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "f4622723-7b50-421a-ad66-b89168b672d3",
   "metadata": {},
   "source": [
    "5.9 (本练习采用上个练习的结果。)\n",
    "(1) 对于 $k=0^{56}$, 有 $D E S_k\\left(D E S_K(x)\\right)=x$ 。为什么使用该密钥会面临安全威胁?\n",
    "(2) 找到另外三个具有同样性质的 DES 密钥, 它们被认为是 DES 的弱密钥。\n",
    "(3) 存在这样的 4 个弱密钥是否说明了 DES 有严重的弱点? 解释你的观点。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d440927-c342-4c8a-9e1e-13074abe2090",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "549b3b37-5df5-46c1-8d00-17714b1f800c",
   "metadata": {},
   "source": [
    "5.10 描述对下面 DES 修改方法的攻垙。\n",
    "(1) 每轮的子密钥都是 32 比特长, 并且变形函数只将该轮的子密钥和该轮的输入出或 (即 $\\left.\\widetilde{f}(k: R)=k_i \\oplus R\\right)$ )。对于这个例了, 密钥编排不重要, 你可以将 $k_i$ 看成是独立的密钥。\n",
    "(2) 在每一轮中使用相同的 48 比特子密钥而不是不同的子密钥。说明如何可以不用 $2^{48}$ 数 量级的时间进行蝊力搜索将分组密码和随机置换区分开来。\n",
    "提示：练习 5.8 和 5.9 可能有帮助 $\\cdots \\cdots$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cdb8dc76-ba9e-4f5b-8578-fd5e7efb421b",
   "metadata": {},
   "source": [
    "5.11 说明对三轮 DES 攻击的改进就是使用两个输入/输出对, 在 $2 \\cdot 2^{28}+2 \\cdot 2^{12}$ 时间内恢复 密钥。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac851720-866f-41ee-b086-693ce0b9fdd4",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "afc6182b-459f-441d-acc1-acb573a7d24b",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "3fa89149-f0c6-4dc6-b06a-00b4079ec9c3",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "f7b05c8e-7a51-406c-a709-1a36ab629b00",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "8aea27da-4f66-4c85-9ba9-130f1f2de3b8",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "698f39dd-d1fe-43c7-9c3d-6ed0ccc30359",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "41bd81c0-a47c-473d-9124-4cbc06d5b2d3",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "2791d2ea-c371-4820-a4d4-90211b23a50e",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "3d57d0cf-d5ff-4f78-86f4-500f948f903c",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "67134b66-f0c4-4cc7-8a18-a8e14b1b8d2c",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
